iT邦幫忙

2026 iThome 鐵人賽

0
Build on Google AI

把Google AI當夥伴打造個人高效Coding工作流系列 第 8 篇

第八天常數與靜態的架構規範——記憶體生命週期與單例模式的三種安全寫法

  • 分享至 

  • xImage
  •  

一、 static 的本質與邊界

  • 歸屬不同:非靜態成員隨new誕生在Heap;static成員隨類別載入配置,脫離個別實例,由Class本身直接持有。
  • 無this指針:靜態方法執行時Heap上可能根本沒有任何物件實體,因此靜態方法內嚴禁直接存取非靜態屬性與方法。
  • 記憶體洩漏風險:靜態集合若不斷新增元素卻未清理,因GC Root永遠可達,JVM無法回收,極易導致OutOfMemoryError。

二、 final的防禦契約

  • 修飾變數:鎖定引用位址),一旦賦值不可重新指向新物件;但物件內部狀態依然可變(例如 final List 仍可 .add())。
  • 修飾方法:鎖死實作邏輯,嚴禁子類別改寫(@Override)。
  • 修飾類別:封閉類別邊界,嚴禁被繼承(如 String、Integer)。
  • 編譯期常數折疊(public static final):基本型別與字串常數在編譯期會被 javac直接內聯至調用端字節碼中。

三、 標準工具類三大守則

  • 類別宣告為final:防止被無意義繼承破壞語意。
  • 建構子設為private並拋出例外:徹底杜絕外部或反射惡意實例化。
  • 方法全為純函數:無狀態、僅依賴傳入參數,不產生外部副作用。

四、 單例模式三種安全寫法對照
https://ithelp.ithome.com.tw/upload/images/20261015/20184350ClZeGd6N4k.png
無延遲載入需求:餓漢式。
需要極致延遲載入且無鎖開銷:靜態內部類別。
需動態傳參初始化:雙重檢查鎖定。


上一篇
第七天抽象類別、介面架構取捨與Java 8/9演進
下一篇
第九天String不可變性與字串池
系列文
把Google AI當夥伴打造個人高效Coding工作流 共 13 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言